PostgreSQL WAL日志 Segment
1 背景知识
本章主要介绍WAL Segment 文件。
2 LSN号作为日志文件的寻址空间时
WAL日志文件的大小最大为 2^64Bytes
(即 16M*1TB=16EB
)。
为了高效管理事务日志文件, PostgreSQL 把日志文件划分为 N
个大小为 16M
(internal)的 WAL segment file
。
3 WAL Segment 文件名解析
WAL segment file文件命长度为 24
个字符,由3部分组成,每个部分是8个16进制数字:
- 第1部分:是TimeLineID,取值范围
0x00000000 -> 0xFFFFFFFF
- 第2部分:是逻辑文件ID,取值范围
0x00000000 -> 0xFFFFFFFF
- 第3部分:是物理文件ID,取值范围
0x00000000 -> 0x000000FF
逻辑文件ID占 32bit
,物理文件ID占 8bit
,
16M的文件占24bit,合计64bit.PG通过这三部分的组合,达到最大 64bit
的文件寻址空间。
4 LSN 号解析
4.1 LSN 是什么?
LSN 全程为 Logical Sequence Number
。使用基于
LSN用于 XLOG record 记录写入到WAL日志中的物理位置,大小为 uint64
.在KES中可以理解为事务日志文件中的偏移量(Offset)。
4.2 LSN由3部分组成,
- 逻辑文件ID
- 物理文件ID
- 文件内偏移
4.3 LSN 拆解
如LSN号1/4288E228
- 1 为逻辑文件ID,
- 42 为物理文件ID,
- 88E228为WAL segment file文件内偏移.
Info
按此规则,给定一个LSN,很容易得到其对应的日志文件(假定时间线为1):
LSN-1/4288E228 --> WAL segment file:00000001 00000001 00000042
4.4 wal 日志结构说明
LSN:3FB/AE61A1A0
3FB:代表wal文件的第二部分
AE:代表wal文件的最后两位
61A1A0:代表偏移量
00000001000003FB000000AE
wal文件由24个字符,三部分组成,每部分由8个字符组成,代表含义如下
00000001:代表数据库运行的时间轴,如果恢复过数据库(主备切换)这个值会增大
000003FB:对LSN的第二部分对应
000000AE:代表walfile文件的最后两位